/*
 * 文件名称:          IBaseService.java
 * 版权所有@ 2016——2017 无锡聆音科技有限公司，保留所有权利
 * 时间:             2016年7月27日 下午9:21:11
 */
package com.lingyin.database.transaction.service;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

import com.lingyin.database.transaction.domain.DataPage;

/**
 *  
 * 
 * @项目        hibernate.database.transaction
 * 
 * @作者:       关宏新
 * 
 * @日期:       2016年7月27日
 * 
 * @负责人:    关宏新
 * 
 * @负责小组:   聆音项目组
 * 
 */
public interface IBaseService<T>
{
        
    /**
     * 保存对象
     * @param entity 保存的对象
     * @return T 保存的对象
     */
    T save(final T entity);
    
    /**
     * 保存集合中的所有对象
     * @param entities 保存的对象集合
     */
    void saveAll(final Collection<T> entities);
    
    /**
     * 保存或更新对象
     * @param entity 更新的对象
     * @return T 更新的对象
     */
    T saveOrUpdateEntity(final T entity);
    
    /**
     * 更新对象
     * @param entity 更新的对象
     * @return T 更新的对象
     */
    T update(final T entity);
    
    /**
     * 更新对象
     * @param entity 更新的对象
     * @return T 更新的对象
     */
    T updateOne(final T entity);
    
    /**
     * 更新集合中的所有对象
     * @param entities 保存的对象集合
     */
    void updateAll(final Collection<T> entities);
    
    /**
     * 删除对象
     * @param entity 删除的对象
     */
    void delete(T entity);
    
    /**
     * 删除对象
     * @param entity 删除的对象
     */
     void deleteOne(T entity);
     
     /**
      * 删除集合中所有对象
      * @param entities
      */
     void deleteAll(Collection<T> entities);
     
     /**
      * 删除entityclass实例，idName为该实例的主键名
      * @param entityClass 实例类
      * @param idName 实例类的主键名，该名为对象中定义的主键名，不是数据库表的主键字段
      * @param ids 具体的主键值
      * @return Object 删除结果
      */
     Object deleteEntityByID(Class<?> entityClass, String idName, Serializable ... ids);
     
     /**
      * 通过主键查找该类的对象
      * @param entityClass 对象class
      * @param value 变量值
      * @return T 查询的对象
      */
     T findByKey(Class<T> entityClass, Serializable value);
     
     /**
      * 获得某个实例的记录总数。
      * @param clazz 实例的class对象
      * @return long 对象数量
      */
     long getCount(final Class<?> clazz);
     
     /**
      * 通过某个变量值查找该类的所有数量的对象
      * @param entityClass 对象class
      * @return List<T> 结果值
      */
     List<T> findAll(Class<T> entityClass);
     
     /**
      * 通过某个变量值查找该类的一定数量的对象
      * @param entityClass 对象class
      * @param start 获取对象的开始位置，如果小于等于0，则表示从第一个记录开始获取。
      * @param count 获取对象的数量，如果小于等于0，则表示从start位置开始获取后续所有对象。
      * @return List<T> 结果值
      */
     List<T> findPage(Class<T> entityClass, int start, int count);
     
     /**
      * 通过某个变量值查找该类的所有对象
      * @param entityClass 对象class
      * @param propertyName 对象的属性定义名
      * @param value 变量值
      * @return List<T> 结果值
      */
     List<T> findByProperty(Class<T> entityClass, String propertyName, Object value);
     
     /**
      * 通过某个变量值查找该类的一定数量的对象
      * @param entityClass 对象class
      * @param page 分页对象，该对象的值具体参见DataPage定义要求。
      * @return DataPage 分页结果值
      */
     DataPage<T> findPage(Class<T> entityClass, DataPage<T> page);
    
}
